<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="utf-8" lang="utf-8">
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>
   文件上传类 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档
  </title>
  <link rel="shortcut icon" href="/user_guide/../images/design/favicon.ico" type="image/x-icon" />
  <link rel="stylesheet" type="text/css" media="all" href="/user_guide/userguide.css" />
  <link rel="search" href="/user_guide/../CodeIgniterSearch.xml" type="application/opensearchdescription+xml" title="CodeIgniter 搜索" />
  <link rel="canonical" href="/user_guide/libraries/file_uploading.html" />
  <script type="text/javascript" src="/user_guide/nav/nav.js">
  </script>
  <script type="text/javascript" src="/user_guide/nav/prototype.lite.js">
  </script>
  <script type="text/javascript" src="/user_guide/nav/moo.fx.js">
  </script>
  <script type="text/javascript" src="/user_guide/nav/user_guide_menu.js">
  </script>
  <meta name="robots" content="all" />
  <meta name="author" content="ExpressionEngine Dev Team" />
  <meta name="description" content="CodeIgniter 中文手册, CodeIgniter 用户指南, CodeIgniter User Guide, Wiki 文档" />
 </head>
 <body>
  <!-- START NAVIGATION -->
  <div id="nav">
   <div id="nav_inner">
    <script type="text/javascript">
     create_menu('/user_guide/');
    </script>
   </div>
  </div>
  <script type="text/javascript">
   _setNavigation();
  </script>
  <div id="nav2">
   <a name="top">
   </a>
   <a href="javascript:void(0);" onclick="myHeight.toggle();">
    <img src="/user_guide/images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="切换目录" alt="切换目录" />
   </a>
  </div>
  <div id="masthead">
   <table cellpadding="0" cellspacing="0" border="0" style="width:100%">
    <tr>
     <td width="350">
      <h1>
       CodeIgniter 用户指南 版本 2.0.0
      </h1>
     </td>
     
     <td id="breadcrumb_right">
      <a href="/user_guide/toc.html">
       目录页
      </a>
     </td>
    </tr>
   </table>
  </div>
  <!-- END NAVIGATION -->
  <!-- START BREADCRUMB -->
  <table cellpadding="0" cellspacing="0" border="0" style="width:100%">
   <tr>
    <td id="breadcrumb">
     <a href="/" target="_blank">
      CodeIgniter 中国首页
     </a>
     &nbsp;&#8250;&nbsp;
     <a href="/user_guide/toc.html">用户指南目录</a>
     &nbsp;&#8250;&nbsp;文件上传类
    </td>
    <td id="searchbox">
     <form method="get" action="http://www.google.com/search" target="google_window">
      <input type="hidden" name="client" value="pub-0176846097796333" />
      <input type="hidden" name="forid" value="1" />
      <input type="hidden" name="ie" value="UTF-8" />
      <input type="hidden" name="oe" value="UTF-8" />
      <input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.org.cn/user_guide/" />
      搜索用户指南&nbsp;
      <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />
      &nbsp;
      <input type="submit" class="submit" name="sa" value="Go" />
     </form>
    </td>
   </tr>
  </table>
  <!-- END BREADCRUMB -->
  <div style="clear:both;text-align:right;padding: 6px 40px 0 0;">
   <a href="http://codeigniter.com/user_guide/libraries/file_uploading.html" target="_blank">
    查看原文
   </a>
  </div>
  <!--<br clear="all"  />-->
  <!-- START CONTENT -->
  <div id="content">
   <h1>
    文件上传类
   </h1>
   <p>
    CodeIgniter 的文件上传类允许文件被上传。您可以设置指定上传某类型的文件及指定大小的文件。
   </p>
   <h2>
    处理过程
   </h2>
   <p>
    上传文件普遍的过程：
   </p>
   <ul>
    <li>
     一个上传文件用的表单，允许用户选择一个文件并上传它。
    </li>
    <li>
     当这个表单被提交，该文件被上传到指定的目录。
    </li>
    <li>
     同时，该文件将被验证是否符合您设定的要求。
    </li>
    <li>
     一旦文件上传成功，还要返回一个上传成功的确认窗口。
    </li>
   </ul>
   <p>
    这里有一个简短的教程来显示这个过程。此后你将会找到相关的参考信息。
   </p>
   <h2>
    创建上传表单
   </h2>
   <p>
    运用文本编辑器创建一个名为
    <dfn>
     upload_form.php
    </dfn>
    的文件，复制以下代码并保存在
    <samp>
     applications/views/
    </samp>
    目录里：
   </p>
   <textarea class="textarea" style="width:100%" cols="50" rows="23">
    &lt;html>
&lt;head>
&lt;title>Upload Form&lt;/title>
&lt;/head>
&lt;body>

&lt;?php echo $error;?&gt;

&lt;?php echo form_open_multipart('upload/do_upload');?&gt;

&lt;input type="file" name="userfile" size="20" />

&lt;br />&lt;br />

&lt;input type="submit" value="upload" />

&lt;/form>

&lt;/body>
&lt;/html>
   </textarea>
   <p>
    你会看到这里运用到了一个表单辅助函数来创建表单的开始标签，文件上传需要一个 multipart form，因为这个表单辅助函数为你创建了一个合适的语句。你还会看到我们运用了一个$error变量，当用户提交该表单出现错误时会显示相关的出错信息。
   </p>
   <h2>
    上传成功的页面
   </h2>
   <p>
    运用文本编辑器创建一个名为
    <dfn>
     upload_success.php
    </dfn>
    的文件。复制以下代码保存到
    <samp>
     applications/views/
    </samp>
    目录里：
   </p>
   <textarea class="textarea" style="width:100%" cols="50" rows="20">
    &lt;html>
&lt;head>
&lt;title>Upload Form&lt;/title>
&lt;/head>
&lt;body>

&lt;h3>Your file was successfully uploaded!&lt;/h3>

&lt;ul>
&lt;?php foreach($upload_data as $item => $value):?&gt;
&lt;li>&lt;?php echo $item;?&gt;: &lt;?php echo $value;?&gt;&lt;/li>
&lt;?php endforeach; ?&gt;
&lt;/ul>

&lt;p>&lt;?php echo anchor('upload', 'Upload Another File!'); ?&gt;&lt;/p>

&lt;/body>
&lt;/html>
   </textarea>
   <h2>
    控制器
   </h2>
   <p>
    运用文本编辑器，创建一个名为
    <dfn>
     upload.php
    </dfn>
    的控制器.复制以下代码并保存到
    <samp>
     applications/controllers/
    </samp>
    目录里：
   </p>
   <textarea class="textarea" style="width:100%" cols="50" rows="43">
    &lt;?php

class Upload extends CI_Controller &#123;
 
 function __construct()
 &#123;
  parent::__construct();
  $this-&gt;load-&gt;helper(array('form', 'url'));
 &#125;
 
 function index()
 &#123; 
  $this-&gt;load-&gt;view('upload_form', array('error' => ' ' ));
 &#125;

 function do_upload()
 &#123;
  $config['upload_path'] = './uploads/';
  $config['allowed_types'] = 'gif|jpg|png';
  $config['max_size'] = '100';
  $config['max_width']  = '1024';
  $config['max_height']  = '768';
  
  $this-&gt;load-&gt;library('upload', $config);
 
  if ( ! $this-&gt;upload-&gt;do_upload())
  &#123;
   $error = array('error' => $this-&gt;upload-&gt;display_errors());
   
   $this-&gt;load-&gt;view('upload_form', $error);
  &#125; 
  else
  &#123;
   $data = array('upload_data' => $this-&gt;upload-&gt;data());
   
   $this-&gt;load-&gt;view('upload_success', $data);
  &#125;
 &#125; 
&#125;
?&gt;
   </textarea>
   <h2>
    上传文件目录
   </h2>
   <p>
    你还需要一个目标文件夹来存储上传的图片。在根目录上创建一个名为
    <dfn>
     uploads
    </dfn>
    的文件并设置该文件的属性为 777。（即可读写）
   </p>
   <h2>
    提交表单
   </h2>
   <p>
    要提交你的表单，输入类似如下的URL：
   </p>
   <code>
    example.com/index.php/
    <var>
     upload
    </var>
    /
   </code>
   <p>
    你将看到一个上传表单，任选一张&#40;jpg, gif,或者png&#41;图片进行提交. 如果你在控制器里设置的路径是正确的，它将开始工作。
   </p>
   <p>
    &nbsp;
   </p>
   <h1>
    参考指南
   </h1>
   <h2>
    初始化文件上传类
   </h2>
   <p>
    与CodeIgniter的其它一些类相似，文件上传类用
    <dfn>
     $this-&gt;load-&gt;library
    </dfn>
    函数在控制器里进行初始化:
   </p>
   <code>
    $this-&gt;load-&gt;library('upload');
   </code>
   <p>
    一旦文件上传类被加载，对象将通过如下方法来引用：
    <dfn>
     $this-&gt;upload
    </dfn>
   </p>
   <h2>
    偏好设置
   </h2>
   <p>
    与其它库类似，你将根据你的偏好设置来控制要被上传的文件，在控制器里，你建立了如下的偏好设置：
   </p>
   <code>
    $config['upload_path'] = './uploads/';
    <br />
    $config['allowed_types'] = 'gif|jpg|png';
    <br />
    $config['max_size'] = '100';
    <br />
    $config['max_width']  = '1024';
    <br />
    $config['max_height']  = '768';
    <br />
    <br />
    $this-&gt;load-&gt;library('upload', $config);
    <br />
    <br />
    // Alternately you can set preferences by calling the initialize function.  Useful if you auto-load the class:
    <br />
    //【如果你在 config文件夹内的 autoload.php 文件中自动加载了 upload 类，或者在构造函数内加载了的话，可以调用初始化函数 initialize 来加载设置。————本括号内由IT不倒翁翻译，加入了自己的理解】
    <br />
    $this-&gt;upload-&gt;initialize($config);
   </code>
   <p>
    以上偏好设置将被完全执行。以下是所有偏好设置参数的描述。
   </p>
   <h2>
    偏好设置参数
   </h2>
   <p>
    以下偏好设置参数是可用的。当你没有特别指定偏好设置参数时，默认值如下：
   </p>
   <table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder">
    <tr>
     <th>
      偏好设置
     </th>
     <th>
      默认值
     </th>
     <th>
      选项
     </th>
     <th>
      描述
     </th>
    </tr>
    <tr>
     <td class="td">
      <strong>
       upload_path
      </strong>
     </td>
     <td class="td">
      None
     </td>
     <td class="td">
      None
     </td>
     <td class="td">
      文件上传路径。该路径必须是可写的，相对路径和绝对路径均可以。
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       allowed_types
      </strong>
     </td>
     <td class="td">
      None
     </td>
     <td class="td">
      None
     </td>
     <td class="td">
      允许上传文件的MIME类型；通常文件扩展名可以做为MIME类型.  允许多个类型用竖线‘|’分开
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       file_name
      </strong>
     </td>
     <td class="td">
      None
     </td>
     <td class="td">
      想要使用的文件名
     </td>
     <td class="td">
      <p>
       如果设置了这个参数，CodeIgniter 将根据这里设置的文件名来对上传的文件进行重命名。文件名中的扩展名也必须是允许的文件类型。
      </p>
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       overwrite
      </strong>
     </td>
     <td class="td">
      FALSE
     </td>
     <td class="td">
      TRUE/FALSE (boolean)
     </td>
     <td class="td">
      是否覆盖。该参数为TRUE时，如果上传文件时碰到重名文件，将会把原文件覆盖；如果该参数为FALSE，CI将会在新文件的文件名后面加一个数字。If set to true, if a file with the same name as the one you are uploading exists, it will be overwritten. If set to false, a number will be appended to the filename if another with the same name exists.
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       max_size
      </strong>
     </td>
     <td class="td">
      0
     </td>
     <td class="td">
      None
     </td>
     <td class="td">
      允许上传文件大小的最大值（以K为单位）。该参数为0则不限制。注意：通常PHP也有这项限制，可以在php.ini文件中指定。通常默认为2MB。
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       max_width
      </strong>
     </td>
     <td class="td">
      0
     </td>
     <td class="td">
      None
     </td>
     <td class="td">
      上传文件的宽度最大值（像素为单位）。0为不限制。
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       max_height
      </strong>
     </td>
     <td class="td">
      0
     </td>
     <td class="td">
      None
     </td>
     <td class="td">
      上传文件的高度最大值（像素为单位）。0为不限制。
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       max_filename
      </strong>
     </td>
     <td class="td">
      0
     </td>
     <td class="td">
      None
     </td>
     <td class="td">
      文件名的最大长度。0为不限制。
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       encrypt_name
      </strong>
     </td>
     <td class="td">
      FALSE
     </td>
     <td class="td">
      TRUE/FALSE (boolean)
     </td>
     <td class="td">
      是否重命名文件。如果该参数为TRUE，上传的文件将被重命名为随机的加密字符串。当你想让文件上传者也不能区分自己上传的文件的文件名时，是非常有用的。当 overwrite 为 FALSE 时，此选项才起作用。
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       remove_spaces
      </strong>
     </td>
     <td class="td">
      TRUE
     </td>
     <td class="td">
      TRUE/FALSE (boolean)
     </td>
     <td class="td">
      参数为TRUE时，文件名中的空格将被替换为下划线。推荐使用。
     </td>
    </tr>
   </table>
   <h2>
    在配置文件里设置偏好设置参数
   </h2>
   <p>
    如果你不愿意应用如上方法进行偏好设置，你可能用一个配置文件来取代它。简单创建一个名为
    <var>
     upload.php
    </var>
    的文件,添加
    <var>
     $config
    </var>
    数组到该文件里，然后保存文件到：
    <var>
     config/upload.php
    </var>
    ，它将被自动加载。当你把配置参数保存到该文件里，你不需要用
    <dfn>
     $this-&gt;upload-&gt;initialize
    </dfn>
    函数进行手动加载。
   </p>
   <h2>
    运用到的函数
   </h2>
   <p>
    以下函数被运用
   </p>
   <h2>
    $this-&gt;upload-&gt;do_upload()
   </h2>
   <p>
    根据你的偏好配置参数执行操作。注意：默认情况下上传的文件来自于提交表单里名为
    <dfn>
     userfile
    </dfn>
    的文件域,并且该表单必须是 "multipart"类型：
   </p>
   <code>
    &lt;form method="post" action="some_action" enctype="multipart/form-data" />
   </code>
   <p>
    如果你想在执行
    <dfn>
     do_upload
    </dfn>
    函数之前自定义自己的文件域名称，可通过以下方法实现：
   </p>
   <code>
    $field_name = "some_field_name";
    <br />
    $this-&gt;upload-&gt;do_upload($field_name)
   </code>
   <h2>
    $this-&gt;upload-&gt;display_errors()
   </h2>
   <p>
    如果
    <dfn>
     do_upload()
    </dfn>
    返回失败，显示错误信息。此函数不会自动输出，而是返回数据，所以你可以按你的要求安排。
   </p>
   <h3>
    格式化错误
   </h3>
   <p>
    上面的函数默认使用&lt;p>标记错误信息。你可以像这样设置自己的分隔符。
   </p>
   <code>
    $this-&gt;upload-&gt;display_errors('
    <var>
     &lt;p>
    </var>
    ', '
    <var>
     &lt;/p>
    </var>
    ');
   </code>
   <h2>
    $this-&gt;upload-&gt;data()
   </h2>
   <p>
    这是一个辅助函数，它返回你上传文件的所有相关信息的数组。
   </p>
   <code>
    Array
    <br />
    (
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[file_name]&nbsp;&nbsp;&nbsp;&nbsp;=> mypic.jpg
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[file_type]&nbsp;&nbsp;&nbsp;&nbsp;=> image/jpeg
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[file_path]&nbsp;&nbsp;&nbsp;&nbsp;=> /path/to/your/upload/
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[full_path]&nbsp;&nbsp;&nbsp;&nbsp;=> /path/to/your/upload/jpg.jpg
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[raw_name]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> mypic
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[orig_name]&nbsp;&nbsp;&nbsp;&nbsp;=> mypic.jpg
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[client_name]&nbsp;&nbsp;&nbsp;&nbsp;=> mypic.jpg
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[file_ext]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> .jpg
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[file_size]&nbsp;&nbsp;&nbsp;&nbsp;=> 22.2
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[is_image]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 1
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[image_width]&nbsp;&nbsp;=> 800
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[image_height] => 600
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[image_type]&nbsp;&nbsp;&nbsp;=> jpeg
    <br />
    &nbsp;&nbsp;&nbsp;&nbsp;[image_size_str] => width="800" height="200"
    <br />
    )
   </code>
   <h3>
    解释
   </h3>
   <p>
    这里是对上面数组项的解释。
   </p>
   <table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder">
    <tr>
     <th>
      Item
     </th>
     <th>
      Description
     </th>
    </tr>
    <tr>
     <td class="td">
      <strong>
       file_name
      </strong>
     </td>
     <td class="td">
      已上传的文件名（包括扩展名）
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       file_type
      </strong>
     </td>
     <td class="td">
      文件的Mime类型
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       file_path
      </strong>
     </td>
     <td class="td">
      不包括文件名的文件绝对路径
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       full_path
      </strong>
     </td>
     <td class="td">
      包括文件名在内的文件绝对路径
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       raw_name
      </strong>
     </td>
     <td class="td">
      不包括扩展名在内的文件名部分
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       orig_name
      </strong>
     </td>
     <td class="td">
      上传的文件最初的文件名。这只有在设置上传文件重命名（encrypt_name）时才有效。
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       client_name
      </strong>
     </td>
     <td class="td">
      上传的文件在客户端的文件名。
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       file_ext
      </strong>
     </td>
     <td class="td">
      文件扩展名（包括‘.’）
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       file_size
      </strong>
     </td>
     <td class="td">
      图像大小，单位是kb
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       is_image
      </strong>
     </td>
     <td class="td">
      是否是图像。  1 =是图像。 0 = 不是图像。
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       image_width
      </strong>
     </td>
     <td class="td">
      图像宽度.
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       image_height
      </strong>
     </td>
     <td class="td">
      图像高度
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       image_type
      </strong>
     </td>
     <td class="td">
      文件类型，即文件扩展名（不包括‘.’）
     </td>
    </tr>
    <tr>
     <td class="td">
      <strong>
       image_size_str
      </strong>
     </td>
     <td class="td">
      一个包含width和height的字符串。用于放在一个img标签里。
     </td>
    </tr>
   </table>
   <p>
    &nbsp;
   </p>
   <div id="Contributors">
    翻译贡献者:
cnmiss, helingjun2008, Hex, IT不倒翁, lishen2, roln, szlinz, thankwsx, wangyueqiang, yinzhili
   </div>
   <div id="DocDate">
    最后修改: 2011-08-16 11:55:49
   </div>
  </div>
  <!-- END CONTENT -->
  <div id="footer">
   <p>
    上一个主题:&nbsp;&nbsp;
    <a href="/user_guide/libraries/encryption.html">
     加密类
    </a>
    &nbsp;&nbsp;&middot;&nbsp;&nbsp;
    <a href="#top">
     页首
    </a>
    &nbsp;&middot;&nbsp;&nbsp;
    <a href="/user_guide/toc.html">用户指南目录</a>
    &nbsp;&nbsp;&middot;&nbsp;&nbsp;下一个主题:&nbsp;&nbsp;
    <a href="/user_guide/libraries/form_validation.html">
     表单验证类
    </a>
   </p>
   <p>
    <a href="http://codeigniter.com">
     CodeIgniter
    </a>
    &nbsp;&middot;&nbsp; 版权所有 &#169; 2006-2011 &nbsp;&middot;&nbsp;
    <a href="http://ellislab.com/">
     Ellislab, Inc.
    </a>
   </p>
   <p>
    中文化:
    <a href="">
     CodeIgniter 中国
    </a>
    &nbsp;&middot;&nbsp; 制作: Hex &nbsp;&middot;&nbsp; 版本: 1.20 &nbsp;&middot;&nbsp; 鸣谢: 子非鱼
   </p>
  </div>
  
  <div style="display:none">
   
   <noscript>
    <a href="http://www.51.la/?3289908" target="_blank">
     <img alt="我要啦免费统计" src="http://img.users.51.la/3289908.asp" style="border:none" />
    </a>
   </noscript>
  </div>
 </body>
</html>